package br.idez.idezJet.integracao.vo;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;

/**
 * Entity implementation class for Entity: Pedido
 * 
 */
@Entity
public class Pedido implements Serializable {

	public enum Status {
		Submitted, Unverified, Approved, Shipping, Delivered, Returned
	};

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;

	@NotNull(message = "{campo.nulo}")
	@OneToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
	private Collection<ItemPedido> itensPedido;

	@NotNull(message = "{campo.nulo}")
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private Usuario usuario;

	@NotNull(message = "{campo.nulo}")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataPedido;

	@NotNull(message = "{campo.nulo}")
	private Double total;

	@NotNull(message = "{campo.nulo}")
	private String pedidoID;

	private Status status;

	@Version
	private Timestamp dataUltimaAtualizacao;

	public Pedido() {
		super();
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Collection<ItemPedido> getItensPedido() {
		return this.itensPedido;
	}

	public void setItensPedido(Collection<ItemPedido> itensPedido) {
		this.itensPedido = itensPedido;
	}

	public Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Date getDataPedido() {
		return this.dataPedido;
	}

	public void setDataPedido(Date dataPedido) {
		this.dataPedido = dataPedido;
	}

	public Double getTotal() {
		return this.total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

	/**
	 * @return the status
	 */
	public Status getStatus() {
		return status;
	}

	/**
	 * @param status
	 *            the status to set
	 */
	public void setStatus(Status status) {
		this.status = status;
	}

	/**
	 * @return the pedidoID
	 */
	public String getPedidoID() {
		return pedidoID;
	}

	/**
	 * @param pedidoID
	 *            the pedidoID to set
	 */
	public void setPedidoID(String pedidoID) {
		this.pedidoID = pedidoID;
	}

	/**
	 * Returns the subtotal rice of the entire order, ie. the sum of the base
	 * prices of all line items in this order.
	 */
	public void CalcularPrecoTotal() {
		for (Iterator<ItemPedido> iter = getItensPedido().iterator(); iter
				.hasNext();) {
			ItemPedido item = iter.next();
			this.total += item.getSubTotalProduto();
		}
	}

	/**
	 * @return the dataUltimaAtualizacao
	 */
	public Timestamp getDataUltimaAtualizacao() {
		return dataUltimaAtualizacao;
	}

	/**
	 * @param dataUltimaAtualizacao
	 *            the dataUltimaAtualizacao to set
	 */
	public void setDataUltimaAtualizacao(Timestamp dataUltimaAtualizacao) {
		this.dataUltimaAtualizacao = dataUltimaAtualizacao;
	}
	
	public String toString(){
		
		StringBuffer sb = new StringBuffer();
		sb.append(
		"Id do pedido - " + this.id +
		"Usuario do pedido - " + this.usuario.toString() +
		"Itens do Pedido - "); 
		
		for(ItemPedido i : itensPedido){
			sb.append(i.toString() + ", ");
		}
		
		return sb.toString();
	}

}
